package main

import (
	"fmt"
	"gitee.com/lxx_23/lxx-go-fun/app"
	"gitee.com/lxx_23/lxx-go-fun/utils"
	"github.com/gin-gonic/gin"
	api "module-gin/api/example"
	"module-gin/config"
	"module-gin/logger"
	"module-gin/router"
	service "module-gin/service/example"
)

func init() {
	// 初始化 logger
	logger.InitLogger(config.Config.Env)
}

func main() {
	g := app.NewGinApp(
		app.WithGinServerName(config.Config.Name),
		app.WithGinPort(config.Config.Server.Port),
		app.WithGinUrlPrefix(config.Config.Server.Prefix),
		app.WithGinHealth(true),
		app.WithGinPprof(true),
		app.WithGinCors(true),
		// headers 可携带的参数
		app.WithGinHeaders([]string{}),
		app.WithGinTracId(true),
		// panic 错误 response nil 为 default
		app.WithGinRuntimePanic(nil),
		app.WithGinOption([]gin.OptionFunc{}),
		// request 参数校验
		app.WithGinValidator(&app.GinValidateHandler{
			Language:        "zh",
			CustomValidator: []utils.CustomValidator{},
		}),
		// 自定义 接口
		app.WithGinRegisterHandler(func(r *gin.RouterGroup) {
			// 自定义 http 接口
			router.RegisterTestRouter(r)

			// 自定义 protobuf grpc 接口
			api.RegisterAppExampleHelloServerHTTPServer(&service.ApiService{}, r)
		}),
		// logger
		app.WithGinLogger(&logger.Log{}),
	)

	// 进程侦听退出
	go func() {
		app.NewStopOsExit(
			app.WithOsExitFun(func() error {
				// 此处可以处理一些 db close ...
				fmt.Println("优雅退出成功！")
				return nil
			}),
		).Watch()
	}()

	// 会阻塞 主线程
	g.Run()
}
